/**
 * @file    elog_file.h
 * @brief   EasyLogger File插件头文件
 * @details 本文件定义了EasyLogger文件存储插件的接口和数据结构，包括：
 *          - 文件日志存储功能接口声明
 *          - 日志文件轮转和管理接口
 *          - 文件日志读取和清除接口
 *          - 文件存储锁定控制接口
 *          - File插件初始化和反初始化接口
 */

#ifndef __ELOG_FILE__H__
#define __ELOG_FILE__H__

#include <stdio.h>
#include <elog.h>
#include <elog_file_cfg.h>

#ifdef __cplusplus
extern "C" {
#endif

/* ---------------------------------------- 版本信息定义 -------------------------------------- */
#define ELOG_FILE_SW_VERSION                "V1.0.0"        /* EasyLogger File插件软件版本号 */

/* --------------------------------------- 编译器优化宏定义 ----------------------------------- */
#ifdef linux
#define likely(x) __builtin_expect(!!(x), 1)                /* Linux下分支预测优化宏 */
#define unlikely(x) __builtin_expect(!!(x), 0)              /* Linux下分支预测优化宏 */
#else
#define likely(x)   (x)                                     /* 非Linux系统下的空宏定义 */
#define unlikely(x) (x)                                     /* 非Linux系统下的空宏定义 */
#endif

/* ----------------------------------------- 数据结构定义 ------------------------------------- */
typedef struct {
    char *name;                                             /* 日志文件名 */
    size_t max_size;                                        /* 单个日志文件最大大小 */
    int max_rotate;                                         /* 最大轮转文件数量 */
} ElogFileCfg;

/* ----------------------------------- File插件核心接口函数 ----------------------------------- */
/* elog_file.c */
ElogErrCode elog_file_init(void);                           /* File插件初始化 */
void elog_file_write(const char *log, size_t size);         /* 将日志写入文件 */
void elog_file_config(ElogFileCfg *cfg);                    /* 配置文件日志参数 */
void elog_file_deinit(void);                                /* File插件反初始化 */

/* ----------------------------------- File插件移植层接口函数 --------------------------------- */
/* elog_file_port.c */
ElogErrCode elog_file_port_init(void);                      /* File插件移植层初始化 */
void elog_file_port_lock(void);                             /* 文件日志缓冲区锁定 */
void elog_file_port_unlock(void);                           /* 文件日志缓冲区解锁 */
void elog_file_port_deinit(void);                           /* File插件移植层反初始化 */

#ifdef __cplusplus
}
#endif

#endif
